package map;

import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;

/**
 * java.util.Map 查找表
 * Map体现的结构是一个多行两列的表格，其中左列称为key，右列称为value。
 *
 * Map总是成对保存数据。
 * Map总是根据key获取对应的value。
 * Map要求key不允许重复
 *
 * Map是一个接口，规定了该数据结构的功能
 * 常见的实现类:
 * java.util.HashMap:散列表，使用散列算法实现的Map
 * java.util.TreeMap:使用二叉树实现的Map
 */
public class MapDemo1 {
    public static void main(String[] args) {
        Map<String,Integer> map = new LinkedHashMap<>();
        //内部使用一个链表维护了遍历顺序
//        Map<String,Integer> map = new LinkedHashMap<>();
        /*
            V put(K k,V v)
            将给定的键值对存入Map中。
            Map要求key不允许重复(Map中不存在两个key的equals比较为true的情况):
            如果使用已有的key存入value时，则是替换这个key对应的value值，此时方法返回的
            就是被替换的value。
            如果这个key不存在，则存入键值对后，返回值为null
         */
        Integer value = map.put("语文",99);
        //int value = map.put("语文",99);//报错, 避免用基本类型接收包装类的返回值，因为可能导致自动拆箱时出现空指针
        System.out.println(value);//null
        map.put("数学",98);
        map.put("英语",97);
        map.put("政治",96);
        map.put("地理",95);
        System.out.println(map);//{语文=99, 数学=98, 英语=97, 政治=96, 地理=95}

        value = map.put("数学",60);//重复的key，替换数学原有的值98.并将该值返回
        System.out.println(value);//98
        System.out.println(map);//{语文=99, 数学=60, 英语=97, 政治=96, 地理=95}

        /*
            int size()
            返回当前Map的元素个数(每一组键值对为1个元素)
         */
        int size = map.size();
        System.out.println("size="+size);//size=5

        /*
            V get(Object key)
            根据给定的key获取对应的value
            如果给定的key在Map中不存在，则返回值为null
         */
        value = map.get("数学");
        System.out.println(value);//60
        value = map.get("物理");
        System.out.println(value);//null

        //清空Map的
//        map.clear();
        //判断是否为空Map(不含有任何元素)
        System.out.println("是否是空Map:"+map.isEmpty());//是否是空Map:false

        /*
            boolean containsKey(Object key)
            判断当前Map中是否包含给定的key
            boolean containsValue(Object value)
            判断当前Map中是否包含给定的value
         */
        boolean ck = map.containsKey("语文");
        boolean cv = map.containsValue(97);
        System.out.println("是否包含key:"+ck);//是否包含key:true
        System.out.println("是否包含value:"+cv);//是否包含value:true

        /*
            V remove(Object key)
            根据给定的key删除对应的键值对。返回值为这个key对应的value
         */
        value = map.remove("数学");
        //value = map.remove("体育");
        System.out.println(map);//{语文=99, 英语=97, 政治=96, 地理=95}
        System.out.println(value);//60

        value = map.remove("体育");
        System.out.println(value);//null
    }
}
